﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Chromely
{
    public static partial class Interop
    {
        public static partial class User32
        {
            public enum SystemMetric
            {
                SM_CXSCREEN = 0,
                SM_CYSCREEN = 1,
                SM_CXVSCROLL = 2,
                SM_CYHSCROLL = 3,
                SM_CYCAPTION = 4,
                SM_CXBORDER = 5,
                SM_CYBORDER = 6,
                SM_CXFIXEDFRAME = 7,
                SM_CYFIXEDFRAME = 8,
                SM_CYVTHUMB = 9,
                SM_CXHTHUMB = 10,
                SM_CXICON = 11,
                SM_CYICON = 12,
                SM_CXCURSOR = 13,
                SM_CYCURSOR = 14,
                SM_CYMENU = 15,
                SM_CYKANJIWINDOW = 18,
                SM_MOUSEPRESENT = 19,
                SM_CYVSCROLL = 20,
                SM_CXHSCROLL = 21,
                SM_DEBUG = 22,
                SM_SWAPBUTTON = 23,
                SM_CXMIN = 28,
                SM_CYMIN = 29,
                SM_CXSIZE = 30,
                SM_CYSIZE = 31,
                SM_CXFRAME = 32,
                SM_CYFRAME = 33,
                SM_CXMINTRACK = 34,
                SM_CYMINTRACK = 35,
                SM_CXDOUBLECLK = 36,
                SM_CYDOUBLECLK = 37,
                SM_CXICONSPACING = 38,
                SM_CYICONSPACING = 39,
                SM_MENUDROPALIGNMENT = 40,
                SM_PENWINDOWS = 41,
                SM_DBCSENABLED = 42,
                SM_CMOUSEBUTTONS = 43,
                SM_SECURE = 44,
                SM_CXEDGE = 45,
                SM_CYEDGE = 46,
                SM_CXMINSPACING = 47,
                SM_CYMINSPACING = 48,
                SM_CXSMICON = 49,
                SM_CYSMICON = 50,
                SM_CYSMCAPTION = 51,
                SM_CXSMSIZE = 52,
                SM_CYSMSIZE = 53,
                SM_CXMENUSIZE = 54,
                SM_CYMENUSIZE = 55,
                SM_ARRANGE = 56,
                SM_CXMINIMIZED = 57,
                SM_CYMINIMIZED = 58,
                SM_CXMAXTRACK = 59,
                SM_CYMAXTRACK = 60,
                SM_CXMAXIMIZED = 61,
                SM_CYMAXIMIZED = 62,
                SM_NETWORK = 63,
                SM_CLEANBOOT = 67,
                SM_CXDRAG = 68,
                SM_CYDRAG = 69,
                SM_SHOWSOUNDS = 70,
                SM_CXMENUCHECK = 71,
                SM_CYMENUCHECK = 72,
                SM_MIDEASTENABLED = 74,
                SM_MOUSEWHEELPRESENT = 75,
                SM_XVIRTUALSCREEN = 76,
                SM_YVIRTUALSCREEN = 77,
                SM_CXVIRTUALSCREEN = 78,
                SM_CYVIRTUALSCREEN = 79,
                SM_CMONITORS = 80,
                SM_SAMEDISPLAYFORMAT = 81,
                SM_CYFOCUSBORDER = 84,
                SM_CXFOCUSBORDER = 83,
                SM_REMOTESESSION = 0x1000,
                SM_CXSIZEFRAME = SM_CXFRAME,
                SM_CYSIZEFRAME = SM_CYFRAME,
                SM_CXPADDEDBORDER = 92
            }

            [DllImport(Libraries.User32, ExactSpelling = true)]
            public static extern int GetSystemMetrics(SystemMetric nIndex);

            [DllImport(Libraries.User32, ExactSpelling = true)]
            private static extern int GetSystemMetricsForDpi(SystemMetric nIndex, uint dpi);

            /// <summary>
            ///  Tries to get system metrics for the dpi. dpi is ignored if "GetSystemMetricsForDpi" is not available on the OS that this application is running.
            /// </summary>
            /// <param name="nIndex">index</param>
            /// <param name="dpi">dpi requested</param>
            /// <returns>returns system metrics for dpi</returns>
            public static int GetCurrentSystemMetrics(SystemMetric nIndex, uint dpi)
            {
                if (IsWindows10_1607OrGreater)
                {
                    return GetSystemMetricsForDpi(nIndex, dpi);
                }
                else
                {
                    Debug.Fail("GetSystemMetricsForDpi() is not available on this OS");
                    return GetSystemMetrics(nIndex);
                }
            }
        }
    }
}
